/**
 * @file kbd.h
 * @author lcz (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2022-11-04
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#ifndef KBD_H
#define KBD_H


#include "comm/types.h"

// https://wiki.osdev.org/%228042%22_PS/2_Controller
#define KBD_PORT_DATA 0x60
#define KBD_PORT_STAT 0x64
#define KBD_PORT_CMD 0x64
#define KBD_STAT_RECV_READY (1 << 0)
#define KBD_STAT_SEND_FULL (1 << 1)

/**
 * 特殊功能键
 */
#define KEY_RSHIFT 0x36
#define KEY_LSHIFT 0x2a
#define KEY_CAPS 0x3A

#define KEY_E1 0xE1 // E0编码
#define KEY_E0 0xE0 // E1编码
#define KEY_CTRL 0x1D // E0, 1D或1d
#define KEY_ALT 0x38  // E0, 38或38
// F
#define KEY_F1 (0x3B) 
#define KEY_F2 (0x3C) 
#define KEY_F3 (0x3D)
#define KEY_F4 (0x3E)
#define KEY_F5 (0x3F)
#define KEY_F6 (0x40)
#define KEY_F7 (0x41)
#define KEY_F8 (0x42)
#define KEY_F9 (0x43)
#define KEY_F10 (0x44)
#define KEY_F11 (0x57)
#define KEY_F12 (0x58)

#define KBD_CMD_RW_LED 0xED // 写按键

// 回车的处理
// #define ASCII_DEL '\b'
#define ASCII_DEL 0x7f

/**
 * @brief 键盘扫描码对应的字符结构体，含普通字符及功能键
 */
typedef struct _key_map_t
{
    uint8_t normal;
    uint8_t func;
} key_map_t;
/**
 * 状态指示灯
 */
typedef struct _kbd_state_t
{
    int lshift_press : 1; // 左shift按下
    int rshift_press : 1; // // 右shift按下
    int caps_lock : 1;    // 大写状态
    int lalt_press : 1;   // alt按下
    int lctrl_press : 1;  // alt按下
    int ralt_press : 1;   // ctrl键按下
    int rctrl_press : 1;  // ctrl键按下
} kbd_state_t;

    void
    kbd_init(void);
void exception_handler_kbd(void);

#endif // KBD_H

